﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EveMarketsDAO;

namespace CoreEveMarkets
{
	public class MeilleurPrix
	{
		#region Get & Set

		private int AchatIdStation { get; set; }
		private int AchatIdSystem { get; set; }
		private int AchatIdRegion { get; set; }

		private int VenteIdStation { get; set; }
		private int VenteIdSystem { get; set; }
		private int VenteIdRegion { get; set; }

		#endregion

		#region Constructeur
		/// <summary>
		/// 
		/// </summary>
		/// <param name="achat"></param>
		/// <param name="vente"></param>
		public MeilleurPrix(Tuple<int,int,int> achat, Tuple<int,int,int> vente)
		{
			AchatIdRegion = achat.Item1;
			AchatIdSystem = achat.Item2;
			AchatIdStation = achat.Item3;

			VenteIdRegion = vente.Item1;
			VenteIdSystem = vente.Item2;
			VenteIdStation = vente.Item3;
		} 
		#endregion

		/// <summary>
		/// En fonction du materiel, cette méthode va trouver le meilleur prix.
		/// </summary>
		/// <param name="materiel">Id du materiel à trouver</param>
		/// <returns>Prix d'Achat</returns>
		public decimal PasCherePasChere(int materiel)
		{
			try
			{
				decimal prixTrouve = 0;
				var priceVolume = (from gg in ContexteDAO.ContexteDonnees.MarketsCentral
				             where gg.stationid == this.AchatIdStation
				                   && gg.systemid == this.AchatIdSystem
				                   && gg.regionid == this.AchatIdRegion
				                   && gg.typeid== materiel
				                   && gg.bid == 0
				             orderby gg.price
				             select new
				                    	{
				                    		gg.price,
											gg.volremain
				                    	});

				// Si nous avons plus de 5 lignes (majoritairement))
				if(priceVolume.Count() > 5)
				{
					int volumeTemp = 0;
					// Je prend les 5 premières lignes, et je prends la ligne qui le plus de Volume.
					var test = priceVolume.Take(5);
					foreach (var vari in test)
					{
						if (vari.volremain <= volumeTemp) continue;

						volumeTemp = (int)vari.volremain;
						prixTrouve = (decimal)vari.price;
					}
				}
				else
				{
					int volumeTemp = 0;
					// Je prend les 5 premières lignes, et je prends la ligne qui le plus de Volume.
					foreach (var vari in priceVolume)
					{
						if (vari.volremain > volumeTemp)
						{
							volumeTemp = (int)vari.volremain;
							prixTrouve = (decimal)vari.price;
						}
					}
				}

				return prixTrouve;
			}
			catch(Exception ex)
			{
				// Si je retourne zéro, c'est qu'il n'y a pas de prix de référencé pour cette item.
				return 0;
			}
		}

		/// <summary>
		/// Récupération du prix, le plus bas du marché.
		/// </summary>
		/// <param name="idProduit"></param>
		/// <returns></returns>
		public decimal PrixDeVente(int idProduit)
		{
			try
			{
				var prixVente = (from gg in ContexteDAO.ContexteDonnees.MarketsCentral
							 where gg.stationid == this.AchatIdStation
										   && gg.systemid == this.AchatIdSystem
										   && gg.regionid == this.AchatIdRegion
										   && gg.typeid == idProduit
										   && gg.bid == 0
							 orderby gg.price
							 select gg.price);

				// S'il y a des ventes de cet item
				if (prixVente.Count() > 0)
				{
					// Je retourne le plus petit prix.
					return (decimal) prixVente.Min();
				}
				// Sinon zéro.
				return 0;
			}
			catch (Exception ex)
			{
				// Si je retourne zéro, c'est qu'il n'y a pas de prix de référencé pour cette item.
				return 0;
			}
		}
	}
}
